package com.funsport.task;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.funsport.common.enums.EventStatus;
import com.funsport.entity.Event;
import com.funsport.service.IEventService;
import com.funsport.service.IEventSignupService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 活动状态检查定时任务
 *
 * @author Fun-Sport Team
 */
@Slf4j
@Component
public class EventStatusTask {

    @Autowired
    private IEventService eventService;

    @Autowired
    private IEventSignupService eventSignupService;

    /**
     * 每5分钟检查一次活动状态
     * 检查是否有活动因人数不足需要自动结束
     */
    @Scheduled(fixedRate = 5 * 60 * 1000) // 5分钟
    public void checkEventStatus() {
        try {
            log.debug("开始检查活动状态...");
            
            // 查询即将开始但人数可能不足的活动
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime checkTime = now.plusMinutes(30); // 检查30分钟内开始的活动
            
            LambdaQueryWrapper<Event> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(Event::getStatus, EventStatus.PUBLISHED);
            wrapper.le(Event::getStartTime, checkTime);
            wrapper.ge(Event::getStartTime, now);
            wrapper.isNotNull(Event::getMinParticipants);
            wrapper.gt(Event::getMinParticipants, 0);
            
            List<Event> events = eventService.list(wrapper);
            
            for (Event event : events) {
                checkEventParticipants(event);
            }
            
            log.debug("活动状态检查完成，共检查了 {} 个活动", events.size());
            
        } catch (Exception e) {
            log.error("检查活动状态时发生错误", e);
        }
    }

    /**
     * 检查单个活动的参与人数
     */
    private void checkEventParticipants(Event event) {
        try {
            // 获取当前参与人数
            int currentParticipants = eventSignupService.getConfirmedCount(event.getId());
            
            // 检查是否距离开始时间很近（30分钟内）且人数不足
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime startTime = event.getStartTime();
            
            // 如果距离开始时间30分钟内且人数不足最小要求
            if (startTime.minusMinutes(30).isBefore(now) && 
                currentParticipants < event.getMinParticipants()) {
                
                log.info("活动人数不足，自动结束: eventId={}, title={}, current={}, min={}", 
                        event.getId(), event.getTitle(), currentParticipants, event.getMinParticipants());
                
                // 更新活动状态为已取消
                event.setStatus(EventStatus.CANCELLED);
                eventService.updateById(event);
                
                // TODO: 这里可以添加通知逻辑，通知已报名的用户活动取消
                notifyEventCancellation(event, currentParticipants);
            }
            
        } catch (Exception e) {
            log.error("检查活动参与人数时发生错误: eventId={}", event.getId(), e);
        }
    }

    /**
     * 通知活动取消
     */
    private void notifyEventCancellation(Event event, int currentParticipants) {
        try {
            log.info("发送活动取消通知: eventId={}, title={}, 原因：人数不足({}/{})", 
                    event.getId(), event.getTitle(), currentParticipants, event.getMinParticipants());
            
            // TODO: 实现通知逻辑
            // 1. 获取已报名用户列表
            // 2. 发送微信模板消息或站内通知
            // 3. 如果有费用，可能需要退款处理
            
        } catch (Exception e) {
            log.error("发送活动取消通知失败: eventId={}", event.getId(), e);
        }
    }
}
